c++ - 混合 C++ 和 Fortran
全部标签 我有一个Fortran子例程,我想从C++程序中调用它。它需要一长串浮点参数并使用iso_c_binding内部模块:subroutineparasolve(......)bind(c,name='c_parasolve')use,intrinsic::iso_c_bindingimplicitnone....根据我所读的内容,我明白我需要使用C++的“extern”命令来定义外部函数,然后再调用它。我尝试了两种方法。第一个:extern"C"voidc_parasolve(....);在编译时返回“expectedunqualified-idbeforestringconstant”
假设需要部分特化一个模板类型,该模板类型需要一个可变类型列表,用于所有参数都是特化的情况,比如说,std::integral_constant。以下直接的方法被各种版本的clang和GCC接受,但被VS14(2015)拒绝并出现错误:errorC3522:'t':parameterpackcannotbeexpandedinthiscontexttemplatestructfoo;templatestructfoo...>{/*...*/};foo,std::true_type>bar;我似乎无法在C++标准草案(n4296)中找到任何明确允许或禁止此类模式匹配的内容,因此在我提交针对
我想在fortran90中填充一个尺寸未知的数组。这是MATLAB中的等效代码:fori=1:10A[i]=iend我知道我可以通过大小,但是如何在fortran90中执行此操作,而不会传递数组的大小。我读到我们可以使用指针,但我真的不知道如何处理指针看答案我了解您想在知道数组的最终大小之前开始将元素添加到数组中。例如,您想从文件读取值,直到到达文件末尾,不知道有多少值。我可以想到三种方法:创建足够大小的数组,并记住最终值。integer::a(200),nn=1doa(n)=if()exitn=n+1enddo创建两个可分配的阵列,当您到达一个末端时,使另一个阵列更大,然后交换它们:inte
是否可以将Fortran77函数作为回调函数指针传递给C/C++?如果是,怎么办?我在网上找到的信息与fortran90及更高版本有关,但我的遗留代码库是77。非常感谢 最佳答案 如果可以在FORTRAN77中完成,它将是特定于编译器和平台的。Fortran2003的新ISOCBinding提供了一种混合Fortran和C以及任何遵循或可以遵循C调用约定的语言(例如C++)的标准方式。虽然正式成为Fortran2003的一部分,并且完全支持整个Fortran2003的Fortran编译器极少,但许多Fortran95编译器都支持IS
我想编写一个C++程序,从中调用mvndst_()子例程http://www.math.wsu.edu/faculty/genz/software/fort77/mvndstpack.f在Linux上,如果我创建test.cc:extern"C"{intmvndst_(int*,double*,double*,int*,double*,int*,double*,double*,double*,double*,int*);};intmain(){return0;}并编译通过g++-c-otest.otest.ccgfortran-c-omvndstpack.omvndstpack.fgf
假设我们有类A、B、C、D,其中A是基础,B、C是介于两者之间,D是在菱形模型中派生的。注意:classB在private模式下继承virtualyclassA,C类在保护模式下继承虚拟A类。classA{public:intmember;//notethismember};classB:virtualprivateA//noteprivate{};classC:virtualprotectedA//noteprotected{};classD:publicB,//doesn'tmetterpublicorwhateverherepublicC{};intmain(){Dtest;te
我必须在C++中创建一个动态DLL库,以替代用Fortran编写的旧DLL库,而无需更改主机应用程序(因此函数和参数必须保持不变)。我有那个库中所有Fortran函数的完整规范,但是我需要使用什么工具(编译器),以及在这种情况下编码DLL的方式是什么(stdcall、cdecl、dllexport等-这些线索没有不用多说,我以前从未创建过DLL)。这是遗留DLL中的示例Fortran函数声明:SUBROUTINESetBoundaries(MaxFlow,MinFlow)cDEC$ATTRIBUTESDLLEXPORT::SetBoundariescDEC$ATTRIBUTESALIA
在同一个项目中混合使用C++98和C++11是否安全?我所说的“混合”不仅指链接目标文件,还指包含在使用C++98和C++11编译的源代码中的公共(public)头文件。这个问题的背景是希望至少将大型代码库的一部分过渡到C++11。部分代码在C++CUDA中,编译后可以在GPU或CPU上执行,对应的编译器暂时不支持C++11。然而,大部分代码仅适用于CPU,并且可以使用任何一种C++风格进行编译。一些头文件包含在CPU+GPU和CPU-only源文件中。如果我们现在使用C++11编译器编译CPU-only源文件,我们是否有信心避免不良副作用? 最佳答案
由于MPI不提供二进制兼容性,仅提供源代码兼容性,因此我们不得不将我们的求解器源代码发送给客户,以便他们将我们的求解器与他们首选的MPI版本一起使用。好吧,我们已经到了无法再提供源代码的地步。因此,我正在寻找围绕MPI调用创建包装器的方法。我们的想法是为我们提供stub函数的header,用户将编写实现,从中创建一个动态库,然后我们的求解器将在运行时加载它。但是解决方案并不“优雅”并且容易出错。因为有struct参数(例如,MPI_Request),其struct定义可能因一个MPI实现而异,我们需要接受(void*)用于我们的许多stub参数。此外,如果一个MPI与另一个MPI的参数
打印以下代码:genericoverload但我想要的是在两种情况下都调用了重载或特化,而不是通用的。我并没有试图将重载与模板特化混合在一起,它们在这里是因为没有一个像我预期的那样工作。是否有任何模板魔术可以实现这一目标?#includeclassInterface{};classImpl:publicInterface{};classBar{public:templatevoidfoo(T&t){std::coutvoidBar::foo(Interface&t){std::cout 最佳答案 使用type_traits测试参数是